<?php

namespace nabu\database\database;

defined('NABU') || exit;

use PDO, PDOException;

// Realiza la conexión con la base de datos.
class database {
  protected $pdo;

  // Configura y conecta la base de datos.
  public function __construct() {
    // Carga el archivo de configuración.
    $config = include_once NABU_DIRECTORY['database'];

    global $messages;

    if (empty($config) || !is_array($config))
      $messages -> errors('The database configuration file is not an array', 400);

    if (empty($config['dbms']) || empty($config['host']) || empty($config['database'])
        || empty($config['user']) || empty($config['password']) || empty($config['charset']))
      $messages -> errors('Set dbms, host, database, user, password and charset in the configuration file', 400);

    $options = array (
      // Mantiene los nombre de las columnas de las tablas como están en la base de datos.
      PDO::ATTR_CASE               => PDO::CASE_NATURAL,
      // Define el manejo de errores de 'PDO' por excepciones, utiliza el objeto 'PDOException'.
      PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
      // Deshabilita las consultas preparadas de 'PDO' y utiliza el sistema nativo del SGBD.
      PDO::ATTR_EMULATE_PREPARES   => false,
      // Define por defecto los resultados de las consultas como arrays asociativos.
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    );

    $dns = $config['dbms'] . ':host=' . $config['host'] . ';dbname=' . $config['database'];

    try {
      // Realiza la conexión de la base de datos.
      $this -> pdo = new PDO($dns, $config['user'], $config['password'], $options);

      // Define la codificación de caracteres para el cliente del SGBD y los resultados de las consultas.
      $this -> pdo -> exec('SET CHARACTER SET ' . $config['charset']);
    }
    catch(PDOException $e) {
      $this -> errors($e -> getMessage(), 'tuvimos un problema de conexión con la base de datos');
    }
  }

  protected function errors(string $exception, string $error) {
    // error_log($exception);

    $GLOBALS['messages'] -> errors('¡Lo sentimos mucho! &#x1F61E;, ' . $error . ', por favor inténtelo más tarde', 500);
  }

  // Define el formato de registro de fechas.
  public function current_date() {
    return date('Y-m-d H:i:s');
  }

  // Finaliza la conexión con la base de datos.
  public function __destruct() {
    $this -> pdo = null;
  }
}
